home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4.zip / Atari Forever 4.iso / SERIE_AI / AI_029 / RDXFS_R1.LZH / archive.lzh / pc_xfs / pc_xfs.h < prev    next >
C/C++ Source or Header  |  1996-02-13  |  13KB  |  374 lines

  1. /*
  2.  * pc_xfs.h vom 13.02.1996
  3.  *
  4.  * Autor:
  5.  * Thomas Binder
  6.  * (binder@rbg.informatik,th-darmstadt.de)
  7.  *
  8.  * Zweck:
  9.  * Headerdatei für die Pure-C-MagiC-3-XFS-Schnittstelle. Die genau
  10.  * Beschreibung der Funktionen entnehme man der MagiC-3-Doku, die für
  11.  * registrierte Benutzer bei ASH erhältlich ist. Hier finden sich nur
  12.  * Erklärungen für die Unterschiede zwischen der Beschreibung in der
  13.  * Doku und den benutzten Funktionspointern, die sich aus technischen
  14.  * Gründen leider nicht vermeiden ließen.
  15.  *
  16.  * History:
  17.  * 04.11.-
  18.  * 05.11.1995: Erstellung
  19.  * 06.11.1995: MX_KERNEL in THE_MX_KERNEL umbenannt, da sich gezeigt
  20.  *             hat, daß die darin erreichbaren Funktionen Register A2
  21.  *             verändern, was Pure C gewaltig in's Schleudern bringt.
  22.  *             Daher mußte auch diese Struktur auf eine eigene
  23.  *             interne abgebildet werden, in der die Funktionen die
  24.  *             Register vorher retten und dann die eigentlich
  25.  *             gewünschte Routine anspringen (siehe pc_xfs.s).
  26.  * 07.11.1995: XATTR-Struktur kommentiert und mit Konstanten versehen
  27.  * 10.11.1995: mode bei xfs_dcreate entfernt, da es in der neuen
  28.  *             MagiC-3-Doku nicht mehr auftaucht.
  29.  * 11.11.1995: _sprintf in der Kernel-Struktur ist nicht mehr cdecl,
  30.  *             da ja sowieso eine vorgeschaltete Routine angesprungen
  31.  *             wird, die dann die Parameter auf den Stack legt.
  32.  * 12.11.1995: xfs_fopen, xfs_xattr und xfs_attrib müssen bei Bedarf
  33.  *             auch einen Zeiger auf einen symbolischen Link liefern,
  34.  *             daher wurde bei den Prototypen ein solcher eingebaut.
  35.  * 23.11.1995: dta_drive war versehentlich WORD statt char.
  36.  * 11.12.1995: Erweiterung der THE_MX_KERNEL-Struktur um die neuen
  37.  *             Elemente von Kernelversion 1 und 2.
  38.  * 26.12.1995: KER_INSTXFS und KER_GETINFO aufgenommen.
  39.  * 28.12.1995: Auch xfs_chmod, xfs_chown und xfs_dcntl müssen u.U.
  40.  *             einen Zeiger auf einen symbolischen Link liefern,
  41.  *             daher wurden die Prototypen entsprechend erweitert.
  42.  * 31.12.1995: path2DD hat jetzt kein unhandliches returns-Array
  43.  *             mehr, sondern die neuen Einzelparameter lastpath,
  44.  *             linkdir und symlink.
  45.  * 02.01.1996: Bei dev_getline waren mode und size vertauscht.
  46.  * 13.02.1996: Der zweite Parameter für install_xfs war unnötig und
  47.  *             ist deswegen jetzt 'rausgeflogen, ebenso wie der
  48.  *             Zeiger real_dev.
  49.  */
  50.  
  51. #ifndef __PC_XFS__
  52. #define __PC_XFS__
  53.  
  54. #include <tos.h>
  55. #include <portab.h>
  56. #include "atarierr.h"
  57.  
  58. #ifndef ELINK
  59. #define ELINK        -300
  60. #define KER_GETINFO    0x100
  61. #define KER_INSTXFS    0x200
  62. #endif
  63.  
  64. /*
  65.  * Zeiger auf die tatsächlich von MagiC angesprochenen Strukturen.
  66.  * Sie werden u.a. bei xfs_drv_open und bei xfs_fopen benötigt, denn
  67.  * es darf natürlich nie der Zeiger auf die C-Struktur eingetragen
  68.  * werden, wenn es sich um MagiC-Strukturen wie DMD, DD, FD, oder DHD
  69.  * handelt.
  70.  */
  71. extern void    *real_xfs;
  72.  
  73. /* Die MagiC-3-DTA */
  74. typedef struct
  75. {
  76.     char    dta_res1[20];
  77.     char    dta_drive;
  78.     char    dta_attribute;
  79.     WORD    dta_time;
  80.     WORD    dta_date;
  81.     LONG    dta_len;
  82.     char    dta_name[14];
  83. } MGX_DTA;
  84.  
  85. /*
  86.  * Der Drive-Media-Descriptor (DMD); prinzipiell erweiterbar, aber
  87.  * leider kann Pure C ja keine Vererbung :(
  88.  */
  89. typedef struct
  90. {
  91.     void    *d_xfs;
  92.     WORD    d_drive;
  93.     void    *d_root;
  94.     WORD    d_biosdev;
  95.     void    *d_driver;
  96.     LONG    *d_devcode;
  97.     void    *d_dfs;
  98. } DMD;
  99.  
  100. /* Die Struktur(en) für dev_stat */
  101. typedef union unsel_union
  102. {
  103.     void    (*unsel)(void *un);
  104.     LONG    status;
  105. } UNSELECT;
  106.  
  107. typedef struct magx_unsel_struct
  108. {
  109.     UNSELECT    unsel;
  110.     LONG        param;
  111. } MAGX_UNSEL;
  112.  
  113. /* Die XATTR-Struktur */
  114. typedef struct {
  115.     UWORD   mode;           /* Filetyp und -modus */
  116. /* Mögliche Filetypen */
  117. #define S_IFMT  0170000     /* Maske zur Isolierung des Filetyps */
  118. #define S_IFCHR 0020000     /* Spezielles BIOS-File (z.B. Device) */
  119. #define S_IFDIR 0040000     /* Verzeichnis */
  120. #define S_IFREG 0100000     /* Normale Datei */
  121. #define S_IFIFO 0120000     /* FIFO (Pipe mit Namen) */
  122. #define S_IMEM  0140000     /* Speicherblock- oder Prozeßfile */
  123. #define S_IFLNK 0160000     /* Symbolischer Link */
  124.  
  125. /*
  126.  * Spezielle Bits (zumindest die ersten beiden können unter MagiC
  127.  * ohne Änderung des XFS-Konzepts nicht korrekt benutzt werden)
  128.  */
  129. #define S_ISUID 04000       /* User-ID des Eigentümers bei Aufruf setzen */
  130. #define S_ISGID 02000       /* Gruppen-ID bei Aufruf setzen */
  131. #define S_ISVTX 01000       /* "Sticky bit", Bedeutung abhängig vom Filetyp */
  132.  
  133. /* Zugriffsrechte */
  134. #define S_IRUSR 0400        /* Eigentümer darf Datei lesen */
  135. #define S_IWUSR 0200        /*      "       "    "   beschreiben */
  136. #define S_IXUSR 0100        /*      "       "    "   ausführen */
  137. #define S_IRGRP 0040        /* Gruppenmitglieder dürfen Datei lesen */
  138. #define S_IWGRP 0020        /*          "           "     "   beschreiben */
  139. #define S_IXGRP 0010        /*          "           "     "   ausführen */
  140. #define S_IROTH 0004        /* Andere dürfen Datei lesen */
  141. #define S_IWOTH 0002        /*    "      "     "   beschreiben */
  142. #define S_IXOTH 0001        /*    "      "     "   ausführen */
  143.  
  144.     LONG    index;          /* Fileindex, wie bei Dreaddir */
  145.     UWORD   dev;            /* Gerät, auf dem die Datei liegt */
  146.     UWORD   rdev;           /* Tatsächliches Gerät (z.B. bei BIOS-Files) */
  147.     UWORD   nlink;          /* Zahl der "echten" Links auf dieses File */
  148.     UWORD   uid;            /* User-ID des Eigentümers */
  149.     UWORD   gid;            /* Gruppen-ID für dieses File */
  150.     LONG    size;           /* Länge in Bytes */
  151.     LONG    blksize;        /* Größe eines Blocks in Bytes */
  152.     LONG    nblocks;        /* Anzahl von Blocks, die die Datei belegt */
  153.     WORD    mtime;          /* Uhrzeit der letzten Modifikation */
  154.     WORD    mdate;          /* Datum der letzten Modifikation */
  155.     WORD    atime;          /* Uhrzeit des letzten Zugriffs auf die Datei */
  156.     WORD    adate;          /* Datum des letzten Zugriffs */
  157.     WORD    ctime;          /* Erzeugungszeit */
  158.     WORD    cdate;          /* Erzeugungsdatum */
  159.     WORD    attr;           /* Standard-TOS-Attribute (wie bei Fattrib) */
  160.     WORD    reserved2;      /* bislang reserviert */
  161.     LONG    reserved3[2];   /* dito */
  162. } XATTR;
  163.  
  164. /*
  165.  * Die XFS-Schnittstelle, wie sie das C-Programm sieht. In dieser
  166.  * Struktur fehlen die Anteile der XFS-Schnittstelle, die für
  167.  * (externe) Treiber ohne Belang sind.
  168.  */
  169. typedef struct
  170. {
  171.     char    xfs_name[8];
  172.     LONG    (*xfs_sync)(DMD *d);
  173.     void    (*xfs_pterm)(BASPAG *pd);
  174. /*
  175.  * Für xfs_garbcoll muß ein Funktionspointer angegeben werden, auch
  176.  * wenn das Filesystem die interne Speicherverwaltung von MagiC 3
  177.  * nicht benutzt. In diesem Fall einfach eine Funktion einbinden, die
  178.  * 0L zurückliefert.
  179.  */
  180.     LONG    (*xfs_garbcoll)(DMD *d);
  181.     void    (*xfs_freeDD)(void *dd);
  182.     LONG    (*xfs_drv_open)(DMD *d);
  183.     LONG    (*xfs_drv_close)(DMD *d, WORD mode);
  184. /*
  185.  * Da xfs_path2DD normalerweise bis zu vier Rückgabewerte hat, werden
  186.  * drei davon in Zeigerparametern zurückgegeben. Die Zuordnung der
  187.  * Register (siehe MagiC-3-Doku):
  188.  * d0: Rückgabewert der C-Funktion
  189.  * d1: *lastpath
  190.  * a0: *linkdir
  191.  * a1: *symlink
  192.  */
  193.     LONG    (*xfs_path2DD)(void *reldir, char *pathname, WORD mode,
  194.         char **lastpath, LONG *linkdir, char **symlink);
  195. /*
  196.  * Auch xfs_sfirst liefert zwei Rückgabeparameter. Da a0 aber nur
  197.  * einen Zeiger auf einen Symbolischen Link enthalten kann, ist der
  198.  * Parameter entsprechend als char ** deklariert, d.h. die C-Funktion
  199.  * muß ggf. hier den Zeiger auf den symbolischen Link ablegen (dabei
  200.  * nicht vergessen, daß die ersten beiden "Buchstaben" die Länge des
  201.  * Links (als Wort) angeben).
  202.  */
  203.     LONG    (*xfs_sfirst)(void *srchdir, char *name, MGX_DTA *dta,
  204.         WORD attrib, char **symlink);
  205. /* Entsprechendes gilt natürlich auch für xfs_snext */
  206.     LONG    (*xfs_snext)(MGX_DTA *dta, DMD *dmd, char **symlink);
  207. #define OM_RPERM    1
  208. #define OM_WPERM    2
  209. #define OM_EXEC        4
  210. #define OM_APPEND    8
  211. #define OM_RDENY    16
  212. #define OM_WDENY    32
  213. #define OM_NOCHECK    64
  214. #define O_CREAT        0x200
  215. #define O_TRUNC        0x400
  216. #define O_EXCL        0x800
  217. /*
  218.  * Auch xfs_fopen liefert unter Umständen einen Zeiger auf einen
  219.  * symbolischen Link...
  220.  */
  221.     LONG    (*xfs_fopen)(void *dir, char *name, WORD omode,
  222.         WORD attrib, char **symlink);
  223.     LONG    (*xfs_fdelete)(void *dir, char *name);
  224.     LONG    (*xfs_link)(void *olddir, void *newdir, char *oldname,
  225.         char *newname, WORD flag_link);
  226. /* Ebenfalls zusätzlich mit Platzhalter für symbolischen Link */
  227.     LONG    (*xfs_xattr)(void *dir, char *name, XATTR *xattr,
  228.         WORD mode, char **symlink);
  229. /* Und noch dreimal... */
  230.     LONG    (*xfs_attrib)(void *dir, char *name, WORD rwflag,
  231.         WORD attrib, char **symlink);
  232.     LONG    (*xfs_chown)(void *dir, char *name, UWORD uid,
  233.         UWORD gid, char **symlink);
  234.     LONG    (*xfs_chmod)(void *dir, char *name, UWORD mode,
  235.         char **symlink);
  236.     LONG    (*xfs_dcreate)(void *dir, char *name);
  237.     LONG    (*xfs_ddelete)(void *dir);
  238.     LONG    (*xfs_DD2name)(void *dir, char *name, WORD bufsize);
  239.     LONG    (*xfs_dopendir)(void *dir, WORD tosflag);
  240.     LONG    (*xfs_dreaddir)(void *dhd, WORD size, char *buf,
  241.         XATTR *xattr, LONG *xr);
  242.     LONG    (*xfs_drewinddir)(void *dhd);
  243.     LONG    (*xfs_dclosedir)(void *dhd);
  244.     LONG    (*xfs_dpathconf)(void *dir, WORD which);
  245.     LONG    (*xfs_dfree)(void *dd, DISKINFO *free);
  246.     LONG    (*xfs_wlabel)(void *dir, char *name);
  247.     LONG    (*xfs_rlabel)(void *dir, char *name, char *buf,
  248.         WORD len);
  249.     LONG    (*xfs_symlink)(void *dir, char *name, char *to);
  250.     LONG    (*xfs_readlink)(void *dir, char *name, char *buf,
  251.         WORD size);
  252. /* Nochmal mit Platzhalter für symbolischen Link */
  253.     LONG    (*xfs_dcntl)(void *dir, char *name, WORD cmd, LONG arg,
  254.         char **symlink);
  255. } THE_MGX_XFS;
  256.  
  257. /*
  258.  * Devicetreiber, wieder aus C-Sicht, trotzdem identisch mit der
  259.  * "echten" Struktur, d.h. hier sind keine vorgeschalteten
  260.  * Assemblerroutinen nötig
  261.  */
  262. typedef struct
  263. {
  264.     LONG    (*dev_close)(void *file);
  265.     LONG    (*dev_read)(void *file, LONG count, char *buffer);
  266.     LONG    (*dev_write)(void *file, LONG count, char *buffer);
  267.     LONG    (*dev_stat)(void *file, MAGX_UNSEL *unselect,
  268.         WORD rwflag, LONG apcode);
  269.     LONG    (*dev_seek)(void *file, LONG where, WORD mode);
  270.     LONG    (*dev_datime)(void *file, WORD *d, WORD setflag);
  271.     LONG    (*dev_ioctl)(void *file, WORD cmd, void *buf);
  272. #define CMODE_RAW        0
  273. #define CMODE_COOKED    1
  274. #define CMODE_ECHO        2
  275.     LONG    (*dev_getc)(void *file, WORD mode);
  276.     LONG    (*dev_getline)(void *file, char *buf, WORD mode,
  277.         LONG size);
  278.     LONG    (*dev_putc)(void *file, WORD mode, LONG value);
  279. } THE_MGX_DEV;
  280.  
  281. /*
  282.  * Die Kernel-Struktur, deren Funktionen leider auch nicht direkt von
  283.  * Pure C aus aufgerufen werden können, da sie unter Umständen das
  284.  * Register A2 verändern, was Pure C überhaupt nicht mag. Also wird
  285.  * diese Struktur ebenfalls nachgebildet... Um die Variablen aus der
  286.  * Struktur anzusprechen empfiehlt es sich, den Zeiger real_kernel
  287.  * zu benutzen, da die Kopie nicht aktualisiert wird und es durchaus
  288.  * denkbar ist, daß einer der Variablenzeiger nachträglich geändert
  289.  * wird. Die vorgeschalteten Funktionen benutzen selbstverständlich
  290.  * auch real_kernel, um die tatsächlich gewünschten Routinen
  291.  * aufzurufen.
  292.  */
  293. typedef struct
  294. {
  295.     WORD        version;
  296.     void        (*fast_clrmem)(void *von, void *bis);
  297.     char        (*to_upper)(WORD c);
  298.     void         (*_sprintf)(char *dest, char *source, LONG *p);
  299.     BASPAG        **act_pd;
  300.     void        *act_appl;
  301.     void        *keyb_appl;
  302.     WORD        *pe_slice;
  303.     WORD        *pe_timer;
  304.     void        (*appl_yield)(void);
  305.     void        (*appl_suspend)(void);
  306.     void        (*appl_begcritic)(void);
  307.     void        (*appl_endcritic)(void);
  308.     LONG        (*event_IO)(LONG ticks_50hz, MAGX_UNSEL *unsel);
  309.     void        (*event_mIO)(LONG ticks_50hz, MAGX_UNSEL *unsel,
  310.         WORD cnt);
  311.     void        (*event_emIO)(void *ap);
  312.     void        (*appl_IOcomplete)(void *ap);
  313. #define SEM_FREE    0
  314. #define SEM_SET        1
  315. #define SEM_TEST    2
  316. #define SEM_CSET    3
  317. #define SEM_GET        4
  318. #define SEM_CREATE    5
  319. #define SEM_DEL        6
  320.     LONG        (*evnt_sem)(WORD mode, void *sem, LONG timeout);
  321.     void        (*Pfree)(BASPAG *pd);
  322.     WORD        int_msize;
  323.     void        *(*int_malloc)(void);
  324.     void        (*int_mfree)(void *memblk);
  325.     void        (*resv_intmem)(void *mem, LONG bytes);
  326.     LONG        (*diskchange)(WORD drv);
  327. /* Dieses Element existiert nur, wenn version >= 1 ist! */
  328.     LONG        (*DMD_rdevinit)(DMD *dmd);
  329. /* Dieses Element existiert nur, wenn version >= 2 ist! */
  330.     LONG        (*proc_info)(WORD code, BASPAG *pd);
  331. } THE_MX_KERNEL;
  332.  
  333. /*
  334.  * Zeiger auf die tatsächlich von Dcntl(KER_INSTXFS, ...) gelieferte
  335.  * Kernelstruktur. Die Funktionen sollten nicht angesprochen werden,
  336.  * für das Auslesen der Variablen ist es jedoch ratsam, immer über
  337.  * diese Struktur zu gehen, da die Kopie nicht aktualisiert wird.
  338.  */
  339. extern THE_MX_KERNEL *real_kernel;
  340.  
  341. /*
  342.  * Routine zur Installation des XFS. Ihr übergibt man den Zeiger auf
  343.  * das zu installierende XFS. Zurück erhält man einen Zeiger auf die
  344.  * Kernelstruktur von MagiC 3 oder NULL, wenn ein Fehler aufgetreten
  345.  * ist.
  346.  */
  347. THE_MX_KERNEL *install_xfs(THE_MGX_XFS *xfs);
  348.  
  349. /* Einfachste Form eines DD */
  350. typedef struct
  351. {
  352.     DMD        *dd_dmd;
  353.     WORD    dd_refcnt;
  354. } MGX_DD;
  355.  
  356. /* Einfachste Form eines FD */
  357. typedef struct
  358. {
  359.     DMD        *fd_dmd;
  360.     WORD    fd_refcnt;
  361.     WORD    fd_mode;
  362.     void    *fd_dev;
  363. } MGX_FD;
  364.  
  365. /* Einfachste Form eines DHD */
  366. typedef struct
  367. {
  368.     DMD        *dhd_dmd;
  369. } MGX_DHD;
  370.  
  371. #endif
  372.  
  373. /* EOF */
  374.